package com.jet.core.enums;

import cn.hutool.core.util.StrUtil;

import java.util.EnumSet;
import java.util.Objects;

/**
 * @author dcl
 * @date 2023-03-03 10:48:26
 */
public interface IEnum {

    int getCode();

    String getName();

    static <E extends Enum<E> & IEnum> E getByCode(Integer code, Class<E> clazz) {
        if (code == null) {
            return null;
        }
        EnumSet<E> all = EnumSet.allOf(clazz);
        return all.stream()
                .filter(e -> e.getCode() == code)
                .findFirst().orElse(null);
    }

    static <E extends Enum<E> & IEnum> E getByName(String name, Class<E> clazz) {
        if (StrUtil.isBlank(name)) {
            return null;
        }
        EnumSet<E> all = EnumSet.allOf(clazz);
        return all.stream()
                .filter(e -> e.getName().equals(name))
                .findFirst().orElse(null);
    }

    static <E extends Enum<E> & IEnum> String getNameByCode(Integer code, Class<E> clazz) {
        E e = getByCode(code, clazz);
        return Objects.nonNull(e) ? e.getName() : null;
    }

    static <E extends Enum<E> & IEnum> String toString(Class<E> clazz) {
        EnumSet<E> all = EnumSet.allOf(clazz);
        return all.toString();
    }
}
